"""
    判断用户是否登录的拦截器
"""

from application import app
from flask import request,redirect,g
from common.models.User import User
from common.libs.UserService.UserService import UserService
from common.libs.UrlManager import UrlManager
from common.libs.LogService import LogService

import re # 正则表达式

# 拦截器的装饰器
@app.before_request
def before_request():

    ignore_urls = app.config['IGNORE_URLS'] # 不需要判断登录信息的url
    ignore_check_login_urls = app.config['IGNORE_CHECK_LOGIN_URLS'] # 不需要判断登录信息的url
    path = request.path # 获取页面地址

    patter = re.compile('%s' % '|'.join(ignore_urls))
    # 如果为真，则不需要登录判断
    if patter.match(path):
        return

    patter = re.compile('%s' % '|'.join(ignore_check_login_urls))
    # 如果为真，则不需要登录判断
    if patter.match(path):
        return

    # 开始判断
    user_info = check_login()

    g.current_user = None
    if user_info:
        g.current_user = user_info

    # 加入日志（用户正常操作日志）
    LogService.addAccessLog()

    if not user_info:
        return redirect(UrlManager.buildUrl('/user/login'))

    return


# 判断用户是否已经登录
def check_login():

    cookies = request.cookies # 获取到所有cookie

    # 获取到指定cookie
    auth_cookie = cookies[app.config['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else None

    # 验证cookie是否取到
    if auth_cookie is None:
        return False

    # 将cookie分割成数组，第一个为加密内容，第二个为uid
    auth_info = auth_cookie.split('#')
    if len(auth_info)!= 2:
        return False

    try:
        user_info = User.query.filter_by(uid = auth_info[1]).first() # 从数据库中查询数据
    except:
        return False

    # 如果数据库中没有该数据
    if user_info is None:
        return False

    # 如果数据库中没有该数据
    if auth_info[0] != UserService.geneAuthCode(user_info):
        return False

    # 用户状态不正确（已被删除）
    if user_info.status != 1:
        return False

    # 返回用户信息
    return user_info
